#include <mpi.h>
#include <random>
#include <iostream>
#include <cmath>
using namespace std;
double sample(double x)
{
    return ::sqrt(8*x+1);
}
double pdf(double &x)
{
    return x/4;
}

int main(int argc, char** argv) {
// 初始化 MPI 环境
    MPI_Init(NULL, NULL);
    std::default_random_engine seed(time(NULL));
    std::uniform_real_distribution<float> random_01(0, 1);

    int myid,numprocs;
// 通过调用以下方法来得到所有可以工作的进程数量
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);


// 得到当前进程的秩

    MPI_Comm_rank(MPI_COMM_WORLD, &myid);

// 得到当前进程的名字
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

// 打印一条带有当前进程名字，秩以及
// 整个 communicator 的大小的 hello world 消息。

    printf("Hello world from processor %s, rank %d out of %d processors\n",
           processor_name, myid, numprocs);

    int n=10000;// loop nums


    double sum=0,my_sum=0;
    for(int i=myid;i<n;i+=numprocs)
    {
        double x=2*random_01(seed)-1;
        double y=2*random_01(seed)-1;
        if(x*x+y*y<1)
        {
            my_sum ++;
        }


    }

    MPI_Reduce(&my_sum, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);


    if(myid==0)
    {
        cout<<4*sum/n<<endl;
    }



// 释放 MPI 的一些资源
    MPI_Finalize();}